// 防抖函数，确保在短时间内多次调用只执行一次
function debounce(func, wait) {
    let timeout;
    return function(...args) {
        const context = this;
        clearTimeout(timeout);
        timeout = setTimeout(() => func.apply(context, args), wait);
    };
}

// 创建一个防抖版本的更新历史记录函数
const updateHistory = debounce(function(link_doctype, link_name, reference_doctype) {
    if (!link_doctype || !link_name) return;
    
    console.log("Updating history for:", link_doctype, link_name, reference_doctype);
    
    frappe.call({
        method: "link_history.api.update_history",
        args: {
            link_doctype: link_doctype,
            link_name: link_name,
            reference_doctype: reference_doctype
        },
        freeze: false,
        quiet: true,
        callback: function(r) {
            console.log("History update response:", r);
        }
    });
}, 500); // 增加防抖时间到 500 毫秒

// 扩展 Awesomplete 的 item 方法，以更好地渲染历史记录项
(function() {
    // 保存原始的 item 方法
    const originalItem = window.Awesomplete.prototype.item;
    
    // 重写 item 方法
    window.Awesomplete.prototype.item = function(text, input, item_id) {
        // 如果是 undefined，返回 null
        if (text === "undefined, undefined" || text === "undefined") {
            return null;
        }
        
        // 如果是对象且有 undefined 值，返回 null
        if (typeof text === "object" && (text.label === "undefined" || text.value === "undefined")) {
            return null;
        }
        
        // 如果有 html 属性，直接使用它
        if (text.html) {
            const element = document.createElement("li");
            element.innerHTML = text.html;
            if (text.disabled) {
                element.setAttribute("aria-disabled", "true");
            }
            return element;
        }
        
        // 如果有 label 和 description 属性，使用自定义格式
        if (text.label) {
            const element = document.createElement("li");
            
            // 创建标签元素
            const labelElement = document.createElement("div");
            labelElement.className = "label";
            labelElement.textContent = text.label;
            element.appendChild(labelElement);
            
            // 如果有描述，创建描述元素
            if (text.description) {
                const descElement = document.createElement("div");
                descElement.className = "description";
                descElement.textContent = text.description;
                element.appendChild(descElement);
            }
            
            // 设置值
            element.setAttribute("data-value", text.value || "");
            
            return element;
        }
        
        // 否则使用原始方法
        return originalItem.call(this, text, input, item_id);
    };
    
    // 重写 _list 方法，过滤掉 undefined 项
    const originalList = window.Awesomplete.prototype._list;
    window.Awesomplete.prototype._list = function() {
        const result = originalList.call(this);
        return result.filter(item => {
            if (item === "undefined, undefined" || item === "undefined") {
                return false;
            }
            if (typeof item === "object" && (item.label === "undefined" || item.value === "undefined")) {
                return false;
            }
            return true;
        });
    };
})();

// 监听 DOM 变化，移除 undefined 项
$(document).ready(function() {
    const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            if (mutation.type === 'childList') {
                const lis = document.querySelectorAll('.awesomplete li');
                lis.forEach(li => {
                    if (li.textContent.includes('undefined')) {
                        li.style.display = 'none';
                    }
                });
            }
        });
    });
    
    observer.observe(document.body, { childList: true, subtree: true });
});

// 扩展 Link 控件，只保留更新历史记录的功能
frappe.provide("frappe.ui.form");

// 扩展Link控件
frappe.ui.form.ControlLink = class LinkHistoryControlLink extends frappe.ui.form.ControlLink {
    make_input() {
        super.make_input();
        this.setup_link_history();
    }

    setup_link_history() {
        // 只有当字段有options时才添加历史功能
        if (!this.df.options) return;

        const link_doctype = this.df.options;
        const reference_doctype = this.doctype;

        // 使用箭头函数保持 this 上下文
        this.$input.on('awesomplete-selectcomplete', () => {
            // 在事件处理函数内部获取当前值
            const currentValue = this.get_value();
            if (currentValue) {
                // 将当前值传入闭包
                this.updateHistoryWithValue(link_doctype, currentValue, reference_doctype);
            }
        });
    }

    // 为每个实例创建独立的防抖函数
    updateHistoryWithValue = debounce((link_doctype, link_name, reference_doctype) => {
        if (!link_doctype || !link_name) return;
        
        // 检查是否禁用了链接历史功能
        if (frappe.boot && frappe.boot.link_history_disabled) {
            console.log("Link History is disabled in system settings");
            return;
        }
        
        // 再次获取当前值
        const currentValue = this.get_value();
        
        // 如果当前值与预期值不同，使用当前值而不是跳过
        if (currentValue !== link_name) {
            // 使用当前值更新历史记录
            link_name = currentValue;
        }
        
        frappe.call({
            method: "link_history.api.update_history",
            args: {
                link_doctype: link_doctype,
                link_name: link_name,
                reference_doctype: reference_doctype
            },
            freeze: false,
            quiet: true,
            callback: function(r) {
                // 如果功能被禁用，记录日志
                if (r.message && r.message.status === "disabled") {
                    console.log("Link History is disabled");
                }
            }
        });
    }, 500);
};